home *** CD-ROM | disk | FTP | other *** search
- BUFSIZE EQU 32768
- CODE SEGMENT
- ASSUME CS:CODE,DS:CODE
- ORG 100H
- START: MOV SI,81H
- MOV AL,' '
- LOOP1: MOV NFLAG,AL
- LODSB
- CMP AL,' '
- JZ LOOP1
- CMP AL,'-'
- JZ PREFIX
- CMP AL,'+'
- JZ SUFFIX
- CMP AL,13
- JZ OKTEST
- MOV DX,OFFSET ERRMSG
- MOV CX,offset (ERREND-ERRMSG)
- ERRXIT: MOV BX,2
- MOV AH,64
- INT 21H
- MOV AX,4C01H
- INT 21H
- PREFIX: SUB BX,BX
- JMP SHORT COMFIX
- SUFFIX: MOV BX,258
- COMFIX: CMP BYTE PTR NFLAG,' '
- JNZ NOCT
- INC BYTE PTR COUNTER
- NOCT: MOV CL,COUNTER
- MOV DI,OFFSET STR1
- LOOP5: DEC CL
- JZ NOADD
- ADD DI,516
- JMP LOOP5
- NOADD: MOV CX,0
- CMP BYTE PTR NFLAG,' '
- JNZ NOINIT
- MOV WORD PTR [DI],0
- MOV WORD PTR 258[DI],0
- NOINIT: ADD DI,BX
- PUSH DI
- INC DI
- INC DI
- LODSB
- CMP AL,'"'
- JNZ BADCHR
- LOOP2: LODSB
- CMP AL,13
- JZ BADCHR
- CMP AL,'"'
- JZ ENDFIX
- LOOP4: STOSB
- INC CX
- JMP LOOP2
- ENDFIX: LODSB
- CMP AL,'"'
- JZ LOOP4
- DEC SI
- DEC SI
- LODSB
- POP DI
- MOV [DI],CX
- JMP LOOP1
- BADCHR: MOV DX,OFFSET CHRMSG
- MOV CX,OFFSET (CHREND-CHRMSG)
- JMP ERRXIT
- OKTEST: CMP BYTE PTR COUNTER,0
- JZ BADCHR
- OKT1: MOV CX,0
- MOV DI,OFFSET STR3+2
- MOV BYTE PTR CURRENT,1
- LOOP3: CALL GETCHR
- JZ OKXIT
- CMP AL,13
- JZ ENDLIN
- STOSB
- INC CX
- JMP LOOP3
- OKXIT: MOV AX,4C00H
- INT 21H
- ENDLIN: CALL GETCHR
- CMP AL,10
- JZ BYPLF
- MOV WORD PTR STR4,1
- BYPLF: MOV STR3,CX
- REPEAT: PUSH SI
- MOV SI,OFFSET STR1
- CALL GETADR
- JZ NOT1
- CALL PUTLIN
- NOT1: MOV CX,STR3
- OR CX,CX
- JZ NOT3
- MOV DX,OFFSET STR3+2
- CALL PUTLIN
- NOT3: MOV SI,OFFSET STR2
- CALL GETADR
- JZ NOT2
- CALL PUTLIN
- NOT2: MOV CX,STR4
- MOV DX,OFFSET STR4+2
- CALL PUTLIN
- POP SI
- INC BYTE PTR CURRENT
- MOV AL,CURRENT
- CMP AL,COUNTER
- JNA REPEAT
- JMP OKT1
- GETCHR: CMP WORD PTR STR4,1
- JNZ NOPREV
- MOV AL,LASTCH
- MOV WORD PTR STR4,2
- JMP SHORT NOREAD
- NOPREV: PUSH CX
- MOV CX,BUFLEFT
- OR CX,CX
- JNZ RDCHR
- SUB BX,BX
- MOV CX,BUFSIZE
- MOV DX,OFFSET CHAR
- MOV AH,63
- INT 21H
- OR AX,AX
- POP CX
- JZ GETXIT
- MOV SI,OFFSET CHAR
- PUSH CX
- MOV CX,AX
- RDCHR: LODSB
- DEC CX
- MOV BUFLEFT,CX
- POP CX
- MOV LASTCH,AL
- NOREAD: CMP AL,26
- GETXIT: RET
- GETADR: MOV CL,CURRENT
- GA1: DEC CL
- JZ GA2
- ADD SI,516
- JMP GA1
- GA2: LODSW
- OR AX,AX
- MOV CX,AX
- MOV DX,SI
- RET
- PUTLIN: MOV BX,1
- MOV AH,64
- INT 21H
- RET
- CHRMSG DB 'Incorrect calling sequence',13,10,10
- ERRMSG DB 'Syntax: COMBINE [-"str1"][+"str2"]'
- DB '[ [+"str3"][-"str4"]] ...',13,10,10
- DB '- for prefix string',13,10
- DB '+ for suffix string',13,10,10
- DB 'Prefix and suffix strings with no spaces between them',13,10
- DB 'are treated as matched sets. One or more spaces',13,10
- DB 'separate sets. Each set is used to construct a line',13,10
- DB 'of output for each input line. If there are two sets,',13,10
- DB 'there will be two lines in the output for each input',13,10
- DB 'line (one for each set).',13,10
- ERREND LABEL BYTE
- CHREND LABEL BYTE
- NFLAG DB ?
- COUNTER DB 0
- CURRENT DB 0
- BUFLEFT DW 0
- LASTCH DB ?
- STR4 DW 2
- DB 13,10
- STR1 LABEL WORD
- STR2 EQU STR1+258
- STR3 EQU STR1+(516*25)
- CHAR EQU STR3+512
- CODE ENDS
- END START
- ?
- ST